﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int scanf_cnt = 0;

void scanf_input(int* p, int len)
{
	for (int i = 0; i < len; i++)
	{
		scanf_cnt=scanf("%d", p+i);//避免数组越界
	}
}
void printf_output(int* p, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", *p);
		if(i!=len-1)	p++;
	}
}
void bubble_sort(int* p, int len)
{
	int temp = 0;
	int count = 0;
	for (int i = 0; i < len - 1; i++)
	{
		int flag = 1;//每趟进行前，假设已经有序
		for (int j = 0; j <len-1-i ; j++)
		{
			if (p[j] >= p[j+1])
			{
				flag = 0;
				count++;
				temp = p[j];
				p[j] = p[j+1];
				p[j + 1] = temp;
			}
		}
		if (flag == 1) break;
	}
	printf_output(p, len);
	printf("\n冒泡排序次数：%d\n", count);
}
int main(void)
{
	{
		int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
		/*
			数组名是数组首元素的地址，但有两个例外
			1.sizeof求出的是整个数组的大小
			2.&数组名：整个数组的地址
			除此之外，所有数组名都是数组首元素地址
			数组的地址和数组元素的地址值相同，意义不同
			指针的类型决定了指针的差异
		*/
		printf("%zd\n", sizeof(arr));
		printf("%p\n", &arr);
		printf("arr   =%p\n", arr);
		printf("&arr  =%p\n", &arr);
		printf("arr+1 =%p\n", arr+1);
		printf("&arr+1=%p\n", &arr+1);
	}
	{
		/*
			scanf 函数的第一个参数是格式字符串，后面的参数是变量的地址。这个函数会读取输入并将其存储在这些地址指向的位置。
			当你写 scanf("%d", p + i); 时，p + i 计算出数组中第 i 个元素的地址。scanf 会将用户输入的整数值存储在这个地址上，即 arr[i]。
			*(arr+i)<==>arr[i]==i[arr]
			形参int arr[]的本质是指针，这种写法更容易理解，所以传参的时候要传入数组元素个数
		*/
	}
	{
		int a = 0;
		int* pa = &a;
		int** ppa = &pa;//int *表示指向的是pa是指针类型，*表示是指针变量
		**ppa = 200;
		printf("**ppa=%d\n", **ppa);
		/*
			二级指针指向的是一级指针变量的地址
			*ppa 通过对ppa中的地址进⾏解引⽤，这样找到的是 pa ，*ppa 其实访问的就是 pa .
			**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作： *pa ，那找到的是 a
			二级指针变量与二维数组没有必然联系
		*/
	}
	{
		int a = 10;
		int b = 20;
		int c = 30;

		int* arr[20] = {&a,&b,&c};//存放整型指针变量的数组
		for (int i = 0; i < 3; i++)
		{
			printf("%d ", *(arr[i]));
		}
	}
	{
		//指针数组模拟二维数组
		int arr1[] = { 1,2,3,4,5 };
		int arr2[] = { 2,3,4,5,6 };
		int arr3[] = { 3,4,5,6,7 };
		int* arr[3] = {arr1,arr2,arr3};
		for (int i = 0; i < 3; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				printf("%d ", arr[i][j]);//*(*(arr+i)+j)
			}
			printf("\n");
		}
	}
	{
		/*
			冒泡排序
		*/
		int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
		int len = sizeof(arr) / sizeof(arr[0]);
		scanf_input(arr, len);
		bubble_sort(arr, len);
	}
	return 0;
}